[XEN] Increase debug stack size from 4kB to 8kB.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 25 Jul 2006 18:38:56 +0000 (19:38 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Tue, 25 Jul 2006 18:38:56 +0000 (19:38 +0100)
Also fix double-fault handlers.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/mm.c
xen/arch/x86/traps.c
xen/arch/x86/x86_32/mm.c
xen/arch/x86/x86_32/traps.c
xen/arch/x86/x86_64/entry.S
xen/arch/x86/x86_64/mm.c
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/config.h

index 20a7e125cd17825e6c136c525621c5f2de02c21f..40928a555d0b755b43df97cc0f89b68e9700fb0c 100644 (file)
@@ -3881,6 +3881,13 @@ void memguard_unguard_range(void *p, unsigned long l)
 
 #endif
 
+void memguard_guard_stack(void *p)
+{
+    BUILD_BUG_ON((DEBUG_STACK_SIZE + PAGE_SIZE) > STACK_SIZE);
+    p = (void *)((unsigned long)p + STACK_SIZE - DEBUG_STACK_SIZE - PAGE_SIZE);
+    memguard_guard_range(p, PAGE_SIZE);
+}
+
 /*
  * Local variables:
  * mode: C
index 46012d666d896c28f1854abb5c752156d81061e7..aac1d70e761e0f6a5ea11a3f2453ef457822b292 100644 (file)
@@ -279,11 +279,14 @@ void show_stack(struct cpu_user_regs *regs)
 void show_stack_overflow(unsigned long esp)
 {
 #ifdef MEMORY_GUARD
-    unsigned long esp_top = get_stack_bottom() & PAGE_MASK;
+    unsigned long esp_top;
     unsigned long *stack, addr;
 
-    /* Trigger overflow trace if %esp is within 100 bytes of the guard page. */
-    if ( ((esp - esp_top) > 100) && ((esp_top - esp) > 100) )
+    esp_top = (esp | (STACK_SIZE - 1)) - DEBUG_STACK_SIZE;
+
+    /* Trigger overflow trace if %esp is within 512 bytes of the guard page. */
+    if ( ((unsigned long)(esp - esp_top) > 512) &&
+         ((unsigned long)(esp_top - esp) > 512) )
         return;
 
     if ( esp < esp_top )
index 20c2dded23824b3b0f0572e301376d288c3a9df0..cc438a701741d5eed641afb060051b3e9cda4596 100644 (file)
@@ -345,11 +345,6 @@ int check_descriptor(struct desc_struct *d)
     return 0;
 }
 
-void memguard_guard_stack(void *p)
-{
-    memguard_guard_range(p, PAGE_SIZE);
-}
-
 /*
  * Local variables:
  * mode: C
index c47ce087082ac22c4e2802127044ea8e66ccc634..3774aa83c8dcc1d60761c3a590aac742579a8e46 100644 (file)
@@ -122,6 +122,7 @@ asmlinkage void do_double_fault(void)
 {
     struct tss_struct *tss = &doublefault_tss;
     unsigned int cpu = ((tss->back_link>>3)-__FIRST_TSS_ENTRY)>>1;
+    char taint_str[TAINT_STRING_MAX_LEN];
 
     watchdog_disable();
 
@@ -129,6 +130,9 @@ asmlinkage void do_double_fault(void)
 
     /* Find information saved during fault and dump it to the console. */
     tss = &init_tss[cpu];
+    printk("*** DOUBLE FAULT: Xen-%d.%d%s    %s\n",
+           XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
+           print_tainted(taint_str));
     printk("CPU:    %d\nEIP:    %04x:[<%08x>]",
            cpu, tss->cs, tss->eip);
     print_symbol(" %s\n", tss->eip);
index 853dfa5715a877ba11736485adc5b2dc943f5813..2318ec9bbcbd3a224cc4fb2416f80087cbfee079 100644 (file)
@@ -471,8 +471,10 @@ ENTRY(spurious_interrupt_bug)
        jmp   handle_exception
 
 ENTRY(double_fault)
-        movl  $TRAP_double_fault,4(%rsp)
-        jmp   handle_exception
+        SAVE_ALL
+        movq  %rsp,%rdi
+        call  do_double_fault
+        ud2
 
 ENTRY(nmi)
         pushq $0
@@ -518,7 +520,7 @@ ENTRY(exception_table)
         .quad do_bounds
         .quad do_invalid_op
         .quad math_state_restore
-        .quad do_double_fault
+        .quad 0 # double_fault
         .quad do_coprocessor_segment_overrun
         .quad do_invalid_TSS
         .quad do_segment_not_present
index 92e565716fad2b58320f5f4f0b8aa91bf0daf10d..87ff181b82056b9c1f182954dd6777e29d39a43d 100644 (file)
@@ -323,12 +323,6 @@ int check_descriptor(struct desc_struct *d)
     return 0;
 }
 
-void memguard_guard_stack(void *p)
-{
-    p = (void *)((unsigned long)p + PAGE_SIZE);
-    memguard_guard_range(p, 2 * PAGE_SIZE);
-}
-
 /*
  * Local variables:
  * mode: C
index bbc4d075b982e32fd078d5af430444bcf0ed217e..a5b7aef8587ea6b2092c836bed619254ca2d525a 100644 (file)
@@ -116,16 +116,38 @@ void show_page_walk(unsigned long addr)
 asmlinkage void double_fault(void);
 asmlinkage void do_double_fault(struct cpu_user_regs *regs)
 {
+    unsigned int cpu, tr;
+    char taint_str[TAINT_STRING_MAX_LEN];
+
+    asm ( "str %0" : "=r" (tr) );
+    cpu = ((tr >> 3) - __FIRST_TSS_ENTRY) >> 2;
+
     watchdog_disable();
 
     console_force_unlock();
 
     /* Find information saved during fault and dump it to the console. */
-    printk("************************************\n");
-    show_registers(regs);
+    printk("*** DOUBLE FAULT: Xen-%d.%d%s    %s\n",
+           XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
+           print_tainted(taint_str));
+    printk("CPU:    %d\nRIP:    %04x:[<%016lx>]",
+           cpu, regs->cs, regs->rip);
+    print_symbol(" %s", regs->rip);
+    printk("\nRFLAGS: %016lx\n", regs->rflags);
+    printk("rax: %016lx   rbx: %016lx   rcx: %016lx\n",
+           regs->rax, regs->rbx, regs->rcx);
+    printk("rdx: %016lx   rsi: %016lx   rdi: %016lx\n",
+           regs->rdx, regs->rsi, regs->rdi);
+    printk("rbp: %016lx   rsp: %016lx   r8:  %016lx\n",
+           regs->rbp, regs->rsp, regs->r8);
+    printk("r9:  %016lx   r10: %016lx   r11: %016lx\n",
+           regs->r9,  regs->r10, regs->r11);
+    printk("r12: %016lx   r13: %016lx   r14: %016lx\n",
+           regs->r12, regs->r13, regs->r14);
+    printk("r15: %016lx\n", regs->r15);
     show_stack_overflow(regs->rsp);
     printk("************************************\n");
-    printk("CPU%d DOUBLE FAULT -- system shutdown\n", smp_processor_id());
+    printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu);
     printk("System needs manual reset.\n");
     printk("************************************\n");
 
index bf7e882afc80ce4a747c15067150bcf83e09ff8c..99c74cf5ad54e347b1a65262e42a4b23ac7b5784 100644 (file)
 
 #ifndef NDEBUG
 #define MEMORY_GUARD
-#ifdef __x86_64__
-#define STACK_ORDER 2
-#endif
 #endif
 
-#ifndef STACK_ORDER
-#define STACK_ORDER 1
-#endif
+#define STACK_ORDER 2
 #define STACK_SIZE  (PAGE_SIZE << STACK_ORDER)
 
+/* Debug stack is restricted to 8kB by guard pages. */
+#define DEBUG_STACK_SIZE 8192
+
 #define MAX_DMADOM_PFN 0x7FFFFUL /* 31 addressable bits */
 
 #ifndef __ASSEMBLY__